/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gcs.Negocio;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TreeMap;

/**
 *
 * @author Emanuel
 */
public class Contracto {

    private String codContracto;
    public static int contador = 0;
    private String codCliente;
    private String codUtilizador;
    private String codEmpresa;
    private GregorianCalendar datainicio;
    private boolean activo;
    private TreeMap<String,Actividade> listaActividades;
    private String codServico;
    private float total;
    private float totalpordia;
    private ArrayList<Prestacao> listaPrestacoes;

    public Contracto(boolean x){
        codCliente="";
        codUtilizador="";
        codEmpresa="";
        datainicio= new GregorianCalendar();
        activo=false;
        codContracto="C"+contador;
        listaActividades = new TreeMap<String, Actividade>();
        codServico="";
        total=0;
        listaPrestacoes=new ArrayList<Prestacao>();
    }

    public Contracto(){
        codCliente="";
        codUtilizador="";
        codEmpresa="";
        datainicio= new GregorianCalendar();
        activo=false;
        codContracto="C"+contador;
        listaActividades = new TreeMap<String, Actividade>();
        codServico="";
        total=0;
        listaPrestacoes=new ArrayList<Prestacao>();
        incContador();
    }

    public Contracto(Contracto c){
        codCliente=c.getCodCliente();
        codUtilizador=c.getCodUtilizador();
        codEmpresa=c.getCodEmpresa();
        datainicio=c.getDatainicio();
        activo=c.isActivo();
        codContracto=c.getCodContracto();
        listaActividades = new TreeMap<String,Actividade>(c.getListaActividades());
        codServico=c.getCodServico();
        total=c.getTotal();
        listaPrestacoes=c.getListaPrestacoes();
        totalpordia=c.getTotalpordia();
        incContador();
    }

    public Contracto(String codCliente,String codUtilizador,String codEmpresa,GregorianCalendar datainicio,boolean activo,TreeMap<String,Actividade> listaActividades,String codServico,int nprestacoes){
        this.codCliente=codCliente;
        this.codUtilizador=codUtilizador;
        this.codEmpresa=codEmpresa;
        this.datainicio=datainicio;
        this.activo=activo;
        this.listaActividades=listaActividades;
        this.codContracto="C"+contador;
        this.codServico=codServico;

        for(Actividade a : listaActividades.values())
            total+=a.getPreco();
        totalpordia=total;
        total=total*365;
        
        int intrevalo = 365/nprestacoes;
        listaPrestacoes = new ArrayList<Prestacao>();
        for(int i=0;i<nprestacoes;i++){
            if(i==0) listaPrestacoes.add(new Prestacao(datainicio,total/nprestacoes,false));
            if(i==1){
                GregorianCalendar datalimite = new GregorianCalendar(datainicio.get(Calendar.YEAR),datainicio.get(Calendar.MONTH),datainicio.get(Calendar.DAY_OF_MONTH));
                datalimite.add(Calendar.DATE, intrevalo);
                listaPrestacoes.add(new Prestacao(datalimite,total/nprestacoes,false));
            }
            if(i==2){
                GregorianCalendar datalimite = new GregorianCalendar(datainicio.get(Calendar.YEAR),datainicio.get(Calendar.MONTH),datainicio.get(Calendar.DAY_OF_MONTH));
                datalimite.add(Calendar.DATE, intrevalo);
                datalimite.add(Calendar.DATE, intrevalo);
                listaPrestacoes.add(new Prestacao(datalimite,total/nprestacoes,false));
            }
        }
        incContador();
    }

    public Contracto(String codCliente,String codUtilizador,String codEmpresa,GregorianCalendar datainicio,boolean activo,TreeMap<String,Actividade> listaActividades,String codContracto,String codServico,int nprestacoes){
        this.codCliente=codCliente;
        this.codUtilizador=codUtilizador;
        this.codEmpresa=codEmpresa;
        this.datainicio=datainicio;
        this.activo=activo;
        this.listaActividades=listaActividades;
        this.codContracto=codContracto;
        this.codServico=codServico;
        for(Actividade a : listaActividades.values())
            total+=a.getPreco();
        totalpordia=total;
        total=total*365;

        int intrevalo = 365/nprestacoes;

        for(int i=0;i<nprestacoes;i++){
            if(i==0) listaPrestacoes.add(new Prestacao(datainicio,total/nprestacoes,false));
            if(i==1){
                GregorianCalendar datalimite = new GregorianCalendar(datainicio.get(Calendar.YEAR),datainicio.get(Calendar.MONTH),datainicio.get(Calendar.DAY_OF_MONTH));
                datalimite.add(Calendar.DATE, intrevalo);
                listaPrestacoes.add(new Prestacao(datalimite,total/nprestacoes,false));
            }
            if(i==2){
                GregorianCalendar datalimite = new GregorianCalendar(datainicio.get(Calendar.YEAR),datainicio.get(Calendar.MONTH),datainicio.get(Calendar.DAY_OF_MONTH));
                datalimite.add(Calendar.DATE, intrevalo);
                datalimite.add(Calendar.DATE, intrevalo);
                listaPrestacoes.add(new Prestacao(datalimite,total/nprestacoes,false));
            }
        }
        incContador();
    }

    public void incContador(){ contador++; }

    @Override
    public Contracto clone() { return new Contracto(this); }

    public String getCodCliente() {
        return codCliente;
    }

    public void setCodCliente(String codCliente) {
        this.codCliente = codCliente;
    }

    public String getCodUtilizador() {
        return codUtilizador;
    }

    public void setCodUtilizador(String codUtilizador) {
        this.codUtilizador = codUtilizador;
    }

    public String getCodEmpresa() {
        return codEmpresa;
    }

    public void setCodEmpresa(String codEmpresa) {
        this.codEmpresa = codEmpresa;
    }

    public GregorianCalendar getDatainicio() {
        return datainicio;
    }

    public void setDatainicio(GregorianCalendar datainicio) {
        this.datainicio = datainicio;
    }

    public boolean isActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    public TreeMap<String, Actividade> getListaActividades() {
        return listaActividades;
    }

    public void setListaActividade(TreeMap<String, Actividade> listasAct) {
        this.listaActividades = listasAct;
    }

    public String getCodContracto() {
        return codContracto;
    }

    public void setCodContracto(String codContracto) {
        this.codContracto = codContracto;
    }

    public String getCodServico() {
        return codServico;
    }

    public void setCodServico(String codServico) {
        this.codServico = codServico;
    }

    public float getTotal() {
        return total;
    }

    public void setTotal(float total) {
        this.total = total;
    }

    public ArrayList<Prestacao> getListaPrestacoes() {
        return listaPrestacoes;
    }

    public void setListaPrestacoes(ArrayList<Prestacao> prestacoes) {
        this.listaPrestacoes = prestacoes;
    }

    public float getTotalpordia() {
        return totalpordia;
    }

    public void setTotalpordia(float totalpordia) {
        this.totalpordia = totalpordia;
    }
    public static int getContador() {
       return contador;
   }

   public static void setContador(int aContador) {
       contador = aContador;
   }

    @Override
   public String toString(){
        return ""+codContracto+": "+datainicio.get(Calendar.DAY_OF_MONTH)+"-"+datainicio.get(Calendar.MONTH)+"-"+datainicio.get(Calendar.YEAR);
   }


   public double alterarActividades(ArrayList<Actividade> lista){
        float totdianovo =0; int numprestacoes = listaPrestacoes.size();double pagardevolver=0;

        listaActividades.clear();
        for(Actividade a : lista){
            //System.out.println("aki");
            totdianovo+=a.getPreco();
            listaActividades.put(a.getcodAct(), a);
        }
        //System.out.println(listaActividades.size());
        
        float totantigo = totalpordia;
        totalpordia=totdianovo;
        
        GregorianCalendar agora = new GregorianCalendar();
        Date dataagora = agora.getTime();
        
        for(Prestacao p : listaPrestacoes){
            Date datanovo = p.getDataLimite().getTime();
            int dif =(int) (dataagora.getTime() - datanovo.getTime());

            if(dif<0)
                pagardevolver = (totantigo-totalpordia)*Math.abs(dif);
            p.setMontante(totalpordia*(365/numprestacoes));
        }
        return pagardevolver;
   }
}
